﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using CodeBuilder2.Model;

namespace CodeBuilder2.DBM
{
    class DBManager
    {
        private static TargetServer tsInfo;
        public static TargetServer TSInfo
        {
            get
            {
                return tsInfo;
            }
            set
            {
                lock (lockThis)
                {
                    if (tsInfo != value)
                    {
                        tsInfo = value;
                    }                    
                }
            }
        }

        static Dictionary<string, TargetServer> connectedServers = new Dictionary<string, TargetServer>(4);

        /// <summary>
        /// 获取当前已经建立连接的所有服务器对象
        /// </summary>
        internal static Dictionary<string, TargetServer> ConnectedServers
        {
            get { return DBManager.connectedServers; }
        }

        /// <summary>
        /// 从已连接的服务器列表中移除指定的服务器
        /// </summary>
        /// <param name="targetServerName">欲移除的服务器的名称</param>
        /// <returns>是否删除成功</returns>
        internal bool RemoveDisconnectedServer(string targetServerName)
        {
            return connectedServers.Remove(targetServerName);
        }

        //private static SqlConnection sc;
        private static object lockThis = new object();

        public static SqlConnection SqlConn
        {
            get
            {
                // 当调用 IDbConnection.Close() 方法后，连接对象的一些关键属性会被清空
                // 如：SqlConnection.Close() 方法执行后，连接对象的 ConnectionString 属性就被设置为 ""
                // 所以，这里不能以静态成员 sc 是否为 null 来判断是否需要重新创建连接
                // 最好是每次都重新创建连接对象
                // 这样一来就没有必要再在类范围声明静态的连接对象的引用（基本上只要该对象的 Close() 方法被调用后，该对象也就废了）
                //if (sc == null)
                //{
                //    sc = BuildSqlConnection();
                //}
                //return sc;
                return BuildSqlConnection();
            }
        }

        private static SqlConnection BuildSqlConnection()
        {
            if (TSInfo == null)
            {
                throw new Exception("TargetServer 对象为空");
            }

            SqlConnection sc = null;
            lock (lockThis)
            {
                string connectionStr = "server=" + TSInfo.Name + ";uid=" + TSInfo.UID + ";pwd=" + TSInfo.PWD + ";database=" + TSInfo.DataBase;

                try
                {
                    // 如果连接池中有符合（连接串一样、没有参与任何事务等等）的连接，则很快就会取出
                    sc = new SqlConnection(connectionStr);
                    // 放入服务器对象池
                    SaveTargetServer(TSInfo.Name, TSInfo);
                }
                catch
                {
                    throw;
                }
            }
            return sc;
        }

        /// <summary>
        /// 将成功建立连接的 TargetServer 对象存入服务器对象池中（如果之前没有放过的话）
        /// </summary>
        /// <param name="serverName">服务器名，作为保存对象的 key</param>
        /// <param name="TSInfo">预计本次需要保存的 TargetServer 对象</param>
        private static void SaveTargetServer(string serverName, TargetServer TSInfo)
        {
            if (!connectedServers.ContainsKey(serverName))
                connectedServers.Add(serverName, TSInfo);
        }
    }
}
